﻿using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using PortaCapena.OdooJsonRpcClient.Attributes;
using PortaCapena.OdooJsonRpcClient.Converters;
using PortaCapena.OdooJsonRpcClient.Models;
using System;
using System.ComponentModel;
using System.Runtime.Serialization;
using static OdooRpcClient.OdooEnum;

namespace OdooRpcClient.Model.Base
{
    [OdooTableName("ir.model")]
    [JsonConverter(typeof(OdooModelConverter))]
    public class IrModelOdooModel : IOdooModel
    {

        /// <summary>
        /// 模型说明  
        /// 字段类型	字符
        /// 必须的
        /// </summary>
        [JsonProperty("name")]
        [Description("模型说明")]
        public string Name { get; set; }

        /// <summary>
        /// 模型  
        /// 字段类型	字符
        /// 必须的
        /// </summary>
        [JsonProperty("model")]
        [Description("模型")]
        public string Model { get; set; }

        /// <summary>
        /// 排序  
        /// 字段类型	字符	
        /// 字段帮助	在模型中对记录进行排序的表达式，例如： "x_sequence asc, id desc"
        /// 必须的
        /// </summary>
        [JsonProperty("order")]
        [Description("排序")]
        public string Order { get; set; }

        /// <summary>
        /// 信息  
        /// 字段类型	文本
        /// </summary>
        [JsonProperty("info")]
        [Description("信息")]
        public string Info { get; set; }

        /// <summary>
        /// 字段  
        /// 字段类型	一对多
        /// 关联的模型	ir.model.fields
        /// 关联字段	model_id
        /// </summary>
        [JsonProperty("field_id")]
        [Description("字段")]
        public long[] FieldId { get; set; }

        /// <summary>
        /// 继承的模型
        /// 字段类型	多对多	
        /// 字段帮助	扩展当前模型清单。
        /// 关联的模型	ir.model
        /// </summary>
        [JsonProperty("inherited_model_ids")]
        [Description("继承的模型")]
        public long[] InheritedModelIds { get; set; }

        /// <summary>
        /// 对象类型  
        /// 字段类型	选择项
        /// </summary>
        [JsonProperty("state")]
        [Description("对象类型")]
        public TypeIrModelOdooEnum? State { get; set; }

        /// <summary>
        /// 访问  
        /// 字段类型	一对多
        /// 关联的模型	ir.model.access			
        /// 关联字段	model_id
        /// </summary>
        [JsonProperty("access_ids")]
        [Description("访问")]
        public long[] AccessIds { get; set; }

        /// <summary>
        /// 记录规则  
        /// 字段类型	一对多
        /// 关联的模型	ir.rule			
        /// 关联字段	model_id
        /// </summary>
        [JsonProperty("rule_ids")]
        [Description("记录规则")]
        public long[] RuleIds { get; set; }

        /// <summary>
        /// 瞬态模型  
        /// 字段类型	布尔型函数
        /// </summary>
        [JsonProperty("transient")]
        [Description("瞬态模型")]
        public bool? Transient { get; set; }

        /// <summary>
        /// 应用内  
        /// 字段类型	字符	
        /// 字段帮助	模块的列表，其中所述对象被定义或继承
        /// </summary>
        [JsonProperty("modules")]
        [Description("应用内")]
        public string Modules { get; set; }

        /// <summary>
        /// 视图  
        /// 字段类型	一对多
        /// </summary>
        [JsonProperty("view_ids")]
        [Description("视图")]
        public long[] ViewIds { get; set; }

        /// <summary>
        /// 总计(包括存档)  
        /// 字段类型	整数	
        /// 字段帮助	此模型记录的全部数量
        /// </summary>
        [JsonProperty("count")]
        [Description("总计(包括存档) ")]
        public int? Count { get; set; }

        /// <summary>
        /// 邮件线程  
        /// 字段类型	布尔型函数	
        /// 字段帮助	该模型是否支持消息和通知。
        /// </summary>
        [JsonProperty("is_mail_thread")]
        [Description("邮件线程")]
        public bool? IsMailThread { get; set; }

        /// <summary>
        /// 邮件活动
        /// 字段类型	布尔型函数	
        /// 字段帮助	此模型是否支持活动。
        /// </summary>
        [JsonProperty("is_mail_activity")]
        [Description("邮件活动")]
        public bool? IsMailActivity { get; set; }

        /// <summary>
        /// 邮件黑名单  
        /// 字段类型	布尔型函数	
        /// 字段帮助	该模型是否支持黑名单。
        /// </summary>
        [JsonProperty("is_mail_blacklist")]
        [Description("邮件黑名单")]
        public bool? IsMailBlacklist { get; set; }

        /// <summary>
        /// 邮件线程短信  
        /// 字段类型	布尔型函数	
        /// 字段帮助	该模型是否支持通过短信发送消息和通知。
        /// </summary>
        [JsonProperty("is_mail_thread_sms")]
        [Description("邮件线程短信")]
        public bool? IsMailThreadSms { get; set; }

        /// <summary>
        /// ID  
        /// 字段类型	整数
        /// </summary>
        [JsonProperty("id")]
        [Description("ID")]
        public long Id { get; set; }

        /// <summary>
        /// 显示名称  
        /// 字段类型	字符
        /// </summary>
        [JsonProperty("display_name")]
        [Description("显示名称")]
        public string DisplayName { get; set; }

        /// <summary>
        /// 创建者  
        /// 字段类型	多对一
        /// </summary>
        [JsonProperty("create_uid")]
        [Description("创建者")]
        public long? CreateUid { get; set; }

        /// <summary>
        /// 创建时间  
        /// 字段类型	日期时间
        /// </summary>
        [JsonProperty("create_date")]
        [Description("创建时间")]
        public DateTime? CreateDate { get; set; }

        /// <summary>
        /// 最后更新者  
        /// 字段类型	多对一
        /// 关联的模型	res.users	
        /// </summary>
        [JsonProperty("write_uid")]
        [Description("最后更新者")]
        public long? WriteUid { get; set; }

        /// <summary>
        /// 更新时间  
        /// 字段类型	日期时间
        /// </summary>
        [JsonProperty("更新时间")]
        [Description("创建时间")]
        public DateTime? WriteDate { get; set; }

        /// <summary>
        /// 最后更改日  
        /// 字段类型	日期时间
        /// </summary>
        [JsonProperty("__last_update")]
        [Description("最后更改日")]
        public DateTime? LastUpdate { get; set; }
    }


    [JsonConverter(typeof(StringEnumConverter))]
    public enum TypeIrModelOdooEnum
    {
        /// <summary>
        /// 自定义对象
        /// </summary>
        [EnumMember(Value = "manual")]
        CustomObject = 1,

        /// <summary>
        /// 基础对象
        /// </summary>
        [EnumMember(Value = "base")]
        BaseObject = 2,
    }

}
